from django.shortcuts import render

# Create your views here.

from django.http import JsonResponse
from django.views import View
from alipay import AliPay
from django.conf import settings
from orders.models import OrderInfo
from payment.models import Payment
import os


class PaymentView(View):

    def get(self, request, order_id):
        '''
        订单支付功能
        '''

        # 1. 通过alipay的sdk和阿里进行交互获取扫码支付页面链接
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 支付成功后阿里云回调地址
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                              'keys/app_private_key.pem'
                                              ),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                'keys/alipay_public_key.pem'
                                                ),
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG

        )

        order = OrderInfo.objects.get(pk=order_id)
        query_str = alipay.api_alipay_trade_page_pay(
            # 付款主题
            subject='美多商城%s' % order_id,
            # 美多商城订单编号
            out_trade_no=str(order_id),
            # 订单总金额
            total_amount=float(order.total_amount),
            # 重要！return_url指定用户付款成功之后，重定向回美多的链接
            return_url=settings.ALIPAY_RETURN_URL
        )
        # 阿里支付的url是固定的，我们需要在这个url尾部拼接查询字符串
        # 参数，来记录用户的美多商城订单等信息
        alipay_url = settings.ALIPAY_URL + "?" + query_str

        # 2. 构建响应返回
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'alipay_url': alipay_url
        })


class PaymentStatusView(View):

    def put(self, request):

        '''
        保存订单支付结果
        '''

        # 1. 提取支付宝传过来的查询字符串参数
        query_str = request.GET  # QueryDict
        #  {"out_trade_no": xxxxx, "trade_no": xxxxx, "sign": xxxxx}
        query_dict = query_str.dict()
        # 剔除支付宝签名， 用来验证数据真伪
        signature = query_dict.pop('sign')
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 支付成功后阿里云回调地址
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                              'keys/app_private_key.pem'
                                              ),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                'keys/alipay_public_key.pem'
                                                ),
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG

        )
        # 2. 校验参数是否伪造
        sucess = alipay.verify(query_dict, signature)  # 返回的是一个bool值
        # 3. 如果不是伪造，写入数据库
        if sucess:
            # 美多商城订单编号
            out_trade_no = query_dict.get('out_trade_no')
            # 支付宝订单编号/支付宝流水号
            trade_no = query_dict.get('trade_no')
            Payment.objects.create(
                order_id=out_trade_no,
                trade_id=trade_no
            )
            # 修改订单状态为待评价
            order = OrderInfo.objects.get(pk=out_trade_no)
            order.status = OrderInfo.ORDER_STATUS_ENUM['UNSEND']
            # 4. 构建响应返回
            return JsonResponse({
                'code': 0,
                'errmsg': 'ok',
                'trade_id': trade_no
            })
        else:
            return JsonResponse({
                'code': 400,
                'errmsg': '支付失败'
            })
